using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using HtmlAgilityPack;
using MagicTraderLib.Schema;

namespace MagicTraderLib.Site.MCM
{
    // https://www.magiccardmarket.eu/
    public class MagicCardMarketSite : IMagicSite
    {
        string BepaalTempFile(string naam, string serie)
        {
            return @"c:\temp\mcm" + naam + "-" + serie + ".html";
        }
        string BepaalDetailsTempFile(string naam, string serie, long nummer)
        {
            return @"c:\temp\mcm" + naam + "-" + serie + nummer + ".html";
        }

        public IEnumerable<Kaart> LeesKaartGegevens(string naam, string serie = null, bool foil = false)
        {
            var fileName = BepaalTempFile(naam,serie);
            // TODO : Dubbel
            var zoekKaart = !String.IsNullOrWhiteSpace(naam);
            var zoekSerie = !String.IsNullOrWhiteSpace(serie);

            if (!zoekKaart && !zoekSerie)
                return Enumerable.Empty<Kaart>();

            if (!File.Exists(fileName))
            {
                DownLoadtoCache(naam, serie, foil, fileName);
            }
            var kaarten = LeesFromCache(fileName, naam, serie);
            return kaarten;
            
            //DownloadPage(url, fileName);

            // kaart naam spaties vervangen door +
            // zoek op kaart
            //https://www.magiccardmarket.eu/?mainPage=showSearchResult&searchFor=strip+mine

            // zoeken op serie en naam
            //https://www.magiccardmarket.eu/?mainPage=advancedSearch&cardName=strip+mine&idExpansion=10
            // idExpansion=10
            // 10 is 4yth edition
            //throw new NotImplementedException();

            // alleen per serie zoeken
            // https://www.magiccardmarket.eu/?mainPage=advancedSearch&idExpansion=10
        }

        private void DownLoadtoCache(string naam, string serie, bool foil, string fileName)
        {
            // TODO : Dubbel
            bool zoekKaart = !String.IsNullOrWhiteSpace(naam);
            bool zoekSerie = !String.IsNullOrWhiteSpace(serie);

            if (!zoekKaart && !zoekSerie)
                return;

            var url = "https://www.magiccardmarket.eu/?mainPage=advancedSearch";
            if (zoekKaart)
            {
                var kaartnaamInUrl = naam.Replace(' ', '+');
                url += @"&cardName=" + kaartnaamInUrl;
            }
            if (zoekSerie)
            {
                var serienaamInUrl = MapSerieNaam(serie);
                url += @"&idExpansion=" + serienaamInUrl;
            }
            WebHelper.DownloadFile(url, fileName);
        }

        private IEnumerable<Kaart> LeesFromCache(string fileName, string naam, string serie)
        {
            var kaarten = new List<Kaart>();

            var file = new FileInfo(fileName);

            if (!file.Exists)
                return Enumerable.Empty<Kaart>();

            var doc = new HtmlDocument();
            doc.Load(file.FullName, Encoding.GetEncoding(1252));
            var fileLinks = doc.DocumentNode.SelectNodes(@"//table/tbody/tr/td[5]/a");

            var allUris =
                fileLinks.Select(fileLink => @"https://www.magiccardmarket.eu/" + fileLink.Attributes["href"].Value);
            
            var options = new ParallelOptions{ MaxDegreeOfParallelism = 10 };
           // download Details

            //Parallel.ForEach(
            //    allUris
            //    , options
            //    , (url, state, index) => DownloadCardDetails(url, index, naam, serie)
            //);

            var eenkaart = LeesCardDetailsCache(1, naam, serie);
            return kaarten;
        }

        private void DownloadCardDetails(string pageUrl, long index, string naam, string serie)
        {
            string fileName = BepaalDetailsTempFile(naam, serie, index);
            WebHelper.DownloadFile(pageUrl, fileName);
        }

        private Kaart LeesCardDetailsCache(long index, string naam, string serie)
        {
            string fileName = BepaalDetailsTempFile(naam, serie, index);
            // parse in domd
            var doc = new HtmlDocument();
            doc.Load(fileName, Encoding.GetEncoding(1252));

            var trs = doc.DocumentNode.SelectNodes(@"//table[@class='availTable']/tbody/tr[position() > 1]");
            string fromPrice = String.Empty, averagePrice = String.Empty;
            foreach (var tr in trs)
            {
                string omschrijving = tr.ChildNodes[0].InnerHtml;
                string prijs = HttpUtility.HtmlDecode(tr.ChildNodes[1].InnerHtml);
                if (omschrijving.ToLowerInvariant().Contains("from"))
                {
                    fromPrice = prijs;
                }
                if (omschrijving.ToLowerInvariant().Contains("average"))
                {
                    averagePrice = prijs;
                }
            }
            var kaart = new McmKaart
            {
                AveragePrice = averagePrice
                , FromPrice = fromPrice
                , Naam = naam
                , Serie = serie
            
            };
            return null;
        }
        private string MapSerieNaam(string serie)
        {
            throw new NotImplementedException();
        }

        

        public IEnumerable<Kaart> LeesKaartGegevensPerSerie(string serie)
        {
            throw new NotImplementedException();
        }
    }

   //Code op Enums te bepalen :)

//    $( document ).ready(function() {
//    ( $("option").each(function(){ $("#me").append( $(this).text().replace(/[ ':]/g,"")+ "=" +$(this).val()+",\n" ); }) );
//});
}